package itheima02;

import domain.Users;
import utils.JDBCUtil;

import java.sql.*;
import java.util.Scanner;

/*
    JDBC模拟用户登录

    注意:
        SQL注入攻击:
        使用+拼接sql语句,存在安全隐患,可能会在sql语句中拼接一个or后面写永远成立的条件,
        使得sql语句前面的所有条件都失效了
        解决方案: 使用PreparedStatement,表示预编译的 SQL 语句的对象
        java.sql.Connection接口,成员方法
        public PreparedStatement prepareStatement(String sql)
          创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。
          参数:
             String sql: sql语句,参数使用?代替
          返回值:
             java.sql.PreparedStatement接口: 方法内部必然返回实现类对象
             成员方法:
                public void setString(int index, String x) : 用来给sql中String参数赋值的
                    参数:
                        int index: 第几个?,从1开始
                        String x: 给?赋值的具体数据
                public  void setObject(int index, String x):  用来给sql中Object参数赋值的
                    参数:
                        int index: 第几个?,从1开始
                        String x: 给?赋值的具体数据
                public  ResultSet executeQuery() :
                    执行查询,返回结果集,不用传递sql语句,创建PreparedStatement对象时已经指定了sql语句
                public int executeUpdate() :
                    执行增删改,返回影响的行数,不用传递sql语句,创建PreparedStatement对象时已经指定了sql语句

    步骤:
        1.获取页面数据
        2.获取数据库连接Connection对象
        3.定义sql语句,参数使用?代替
        4.Connection对象获取执行sql语句的PreparedStatement对象,传递sql语句
        5.PreparedStatement对象调用方法,给sql语句中的?赋值
        6.PreparedStatement对象执行查询,获取结果
        7.处理结果,给页面响应信息回去
        8.关闭资源

        比如:
            用户名: admin
            密码: fejowjfwofew' or '1'='1
            单引号前面要加斜杠\
            select * from users where uname='admin' and upass='fejowjfwofew\' or \'1\'=\'1'
 */
/*public class Demo03JDBCLogin {
    public static void main(String[] args) throws Exception {
        //1.获取页面数据
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名: ");
        String uname = sc.nextLine();
        System.out.println("请输入密码: ");
        String upass = sc.nextLine();

        //2.获取数据库连接Connection对象
        Connection con = JDBCUtil.getConnection();

        //3.定义sql语句,参数使用?代替
        String sql = "select * from users where uname=? and upass=?";

        //4.Connection对象获取执行sql语句的PreparedStatement对象,传递sql语句
        //方法PreparedStatement表示预编译的SQL语句的存储对象。
        //SQL语句已预编译并存储在一个PreparedStatement对象中。 然后可以使用该对象多次有效地执行此语句。
        PreparedStatement pstmt = con.prepareStatement(sql);

        //5.PreparedStatement对象调用方法,给sql语句中的?赋值
        pstmt.setObject(1,uname);
        pstmt.setObject(2,upass);

        System.out.println(pstmt);

        //6.PreparedStatement对象执行查询,获取结果
        ResultSet rs = pstmt.executeQuery();

        //7.处理结果,给页面响应信息回去
        if(rs.next()) {
            System.out.println("登录成功~~");
        } else {
            System.out.println("登录失败~~~~");
        }
        //8.关闭资源
        JDBCUtil.release(con,pstmt,rs);
    }
}*/


public class Demo03JDBCLogin {
    public static void main(String[] args) throws SQLException {
        //1.获取页面数据
        Scanner scanner=new Scanner(System.in);
        System.out.println("输入用户名:");
        String uname=scanner.nextLine();
        Scanner scanner1=new Scanner(System.in);
        System.out.println("输入密码:");
        String upass=scanner.nextLine();

        //2.获取数据库连接Connection对象
        Connection connection=JDBCUtil.getConnection();
        //3.定义sql语句,参数使用?代替
        Statement statement = connection.createStatement();
        //4.Connection对象获取执行sql语句的PreparedStatement对象,传递sql语句
        //select * from users where uname=? and upass=?
        String sql = "select * from users where uname=? and upass=?";
        String sql1 = "select * from users where uname=? and upass=?";
        //5.PreparedStatement对象调用方法,给sql语句中的?赋值
        //prepareStatement是接口PreparedStatement在Connection接口里面的实现类
        PreparedStatement preparedStatement=connection.prepareStatement(sql);
        preparedStatement.setObject(1,uname);
        preparedStatement.setObject(2,upass);
        System.out.println(preparedStatement);
        //6.PreparedStatement对象执行查询,获取结果
        ResultSet resultSet = preparedStatement.executeQuery();
        //7.处理结果,给页面响应信息回去
        if(resultSet.next()){
            System.out.println("登录成功");
        }else {
            System.out.println("登录失败");
        }
        //8.关闭资源
        JDBCUtil.release(connection,statement,resultSet);

    }
}